package controller;

import entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import javax.servlet.http.HttpSession;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/7/29 11:16
 * Version:1.0-SNAPSHOT
 * Description:
 */
@Controller
@SessionAttributes("user")
@RequestMapping("/session")
public class SessionController {

    @RequestMapping("/f1")
    public String f1(HttpSession session){
        User user = new User();
        user.setUsername("admin");
        session.setAttribute("user",user);
        return "scope";
    }

    @RequestMapping("/f2")
    public String f2(User user){
        user.setUsername("alice");
        return "scope";
    }

    @RequestMapping("/f3")
    public String f3(User user){
        System.out.println(user);
        // 当方法参数没有被@ModelAttribute进行标注时
        // 表示当前参数会在request作用域中进行存储
        // 且会在session作用域中进行备份
        // 由于当参数为对象时,会自动进行对参数实例化
        // 当request作用域中没有数据的时候
        // 会将实例化的新对象存储到request作用域中
        // 同时会将实例化的新对象备份到session作用域中
        return "scope";
    }

    @RequestMapping("/f4")
    public String f4(@ModelAttribute("user") User user){
        System.out.println(user);
        // 当方法的参数被@ModelAttribute注解所标注的时候
        // 表示当前参数会在session作用域中进行存储
        // 且会在request作用域中进行备份
        // 当在session中没有读取到对应数据的时候
        // 会直接报错Expected session attribute 'user'
        return "scope";
    }

    @RequestMapping("/f5")
    public String f5(HttpSession session){
        session.invalidate();
        return "scope";
    }

    // 如果使用了@SessionAtrributes注解对session作用域进行读写
    // 则不能再使用session.invalidate()对session的数据进行清除
    // 而必须使用由Spring所提供的方式
    @RequestMapping("/f6")
    public String f6(SessionStatus sessionStatus){
        // 只清除session作用域中的数据
        sessionStatus.setComplete();
        return "scope";
    }

}
